// using UnityEngine;
// using GGameFramework.Core.FSM;
//
// namespace GGameFramework.Examples.FSM
// {
//     /// <summary>
//     /// 玩家攻击状态
//     /// </summary>
//     public class PlayerAttackState : FsmState<PlayerController>
//     {
//         private const string KEY_ATTACK_INPUT = "AttackInput";
//         private const string KEY_IS_GROUNDED = "IsGrounded";
//         private const string KEY_LAST_ATTACK_TIME = "LastAttackTime";
//         
//         private float m_AttackStartTime;
//         private float m_AttackDuration = 0.8f; // 攻击动画持续时间
//         private bool m_AttackExecuted = false;
//         private bool m_AttackHit = false;
//         
//         // 攻击阶段
//         private enum AttackPhase
//         {
//             WindUp,     // 蓄力阶段
//             Strike,     // 攻击阶段
//             Recovery    // 恢复阶段
//         }
//         
//         private AttackPhase m_CurrentPhase = AttackPhase.WindUp;
//         
//         protected internal override void OnInit(IFsm<PlayerController> fsm)
//         {
//             Debug.Log("攻击状态初始化");
//         }
//         
//         protected internal override void OnEnter(IFsm<PlayerController> fsm)
//         {
//             PlayerController player = fsm.Owner;
//             m_AttackStartTime = 0f;
//             m_AttackExecuted = false;
//             m_AttackHit = false;
//             m_CurrentPhase = AttackPhase.WindUp;
//             
//             // 设置攻击动画
//             if (player.GetAnimator() != null)
//             {
//                 player.GetAnimator().SetBool("IsAttacking", true);
//                 player.GetAnimator().SetBool("IsMoving", false);
//                 player.GetAnimator().SetBool("IsJumping", false);
//                 player.GetAnimator().SetTrigger("AttackStart");
//             }
//             
//             // 播放攻击音效
//             // player.PlaySound(attackWindUpSound);
//             
//             // 设置攻击冷却时间
//             player.SetLastAttackTime();
//             
//             Debug.Log("进入攻击状态 - 蓄力阶段");
//         }
//         
//         protected internal override void OnUpdate(IFsm<PlayerController> fsm, float elapseSeconds, float realElapseSeconds)
//         {
//             PlayerController player = fsm.Owner;
//             m_AttackStartTime += elapseSeconds;
//             
//             // 根据攻击阶段执行不同逻辑
//             switch (m_CurrentPhase)
//             {
//                 case AttackPhase.WindUp:
//                     HandleWindUpPhase(fsm, player, elapseSeconds);
//                     break;
//                     
//                 case AttackPhase.Strike:
//                     HandleStrikePhase(fsm, player, elapseSeconds);
//                     break;
//                     
//                 case AttackPhase.Recovery:
//                     HandleRecoveryPhase(fsm, player, elapseSeconds);
//                     break;
//             }
//             
//             // 检查生命值状态
//             int currentHealth = fsm.GetData<IntVariable>("Health")?.Value ?? 100;
//             if (currentHealth <= 0)
//             {
//                 ChangeState<PlayerDeathState>(fsm);
//                 return;
//             }
//         }
//         
//         protected internal override void OnLeave(IFsm<PlayerController> fsm, bool isShutdown)
//         {
//             PlayerController player = fsm.Owner;
//             
//             // 停止攻击动画
//             if (player.GetAnimator() != null)
//             {
//                 player.GetAnimator().SetBool("IsAttacking", false);
//             }
//             
//             Debug.Log("离开攻击状态");
//         }
//         
//         protected internal override void OnDestroy(IFsm<PlayerController> fsm)
//         {
//             Debug.Log("攻击状态销毁");
//         }
//         
//         /// <summary>
//         /// 处理蓄力阶段
//         /// </summary>
//         private void HandleWindUpPhase(IFsm<PlayerController> fsm, PlayerController player, float deltaTime)
//         {
//             // 蓄力阶段持续时间
//             if (m_AttackStartTime >= 0.2f)
//             {
//                 m_CurrentPhase = AttackPhase.Strike;
//                 Debug.Log("攻击状态 - 攻击阶段");
//                 
//                 // 播放攻击音效
//                 // player.PlaySound(attackStrikeSound);
//                 
//                 // 触发攻击动画
//                 if (player.GetAnimator() != null)
//                 {
//                     player.GetAnimator().SetTrigger("AttackStrike");
//                 }
//             }
//         }
//         
//         /// <summary>
//         /// 处理攻击阶段
//         /// </summary>
//         private void HandleStrikePhase(IFsm<PlayerController> fsm, PlayerController player, float deltaTime)
//         {
//             if (!m_AttackExecuted)
//             {
//                 // 执行攻击逻辑
//                 ExecuteAttack(player);
//                 m_AttackExecuted = true;
//             }
//             
//             // 攻击阶段持续时间
//             if (m_AttackStartTime >= 0.4f)
//             {
//                 m_CurrentPhase = AttackPhase.Recovery;
//                 Debug.Log("攻击状态 - 恢复阶段");
//                 
//                 // 触发恢复动画
//                 if (player.GetAnimator() != null)
//                 {
//                     player.GetAnimator().SetTrigger("AttackRecovery");
//                 }
//             }
//         }
//         
//         /// <summary>
//         /// 处理恢复阶段
//         /// </summary>
//         private void HandleRecoveryPhase(IFsm<PlayerController> fsm, PlayerController player, float deltaTime)
//         {
//             // 恢复阶段持续时间
//             if (m_AttackStartTime >= m_AttackDuration)
//             {
//                 // 攻击完成，检查下一步状态
//                 CheckNextState(fsm, player);
//             }
//         }
//         
//         /// <summary>
//         /// 执行攻击逻辑
//         /// </summary>
//         private void ExecuteAttack(PlayerController player)
//         {
//             if (m_AttackHit) return; // 防止重复攻击
//             
//             // 检测攻击范围内的敌人
//             Collider[] hitColliders = Physics.OverlapSphere(player.transform.position, 2f);
//             
//             foreach (var hitCollider in hitColliders)
//             {
//                 if (hitCollider.CompareTag("Enemy"))
//                 {
//                     // 对敌人造成伤害
//                     var enemy = hitCollider.GetComponent<EnemyController>();
//                     if (enemy != null)
//                     {
//                         enemy.TakeDamage(25);
//                         m_AttackHit = true;
//                         
//                         // 播放命中音效
//                         // player.PlaySound(attackHitSound);
//                         
//                         // 显示伤害数字
//                         ShowDamageNumber(hitCollider.transform.position, 25);
//                         
//                         Debug.Log($"攻击命中敌人: {hitCollider.name}");
//                         break;
//                     }
//                 }
//             }
//             
//             // 如果没有命中敌人，播放未命中音效
//             if (!m_AttackHit)
//             {
//                 // player.PlaySound(attackMissSound);
//             }
//         }
//         
//         /// <summary>
//         /// 检查下一步状态
//         /// </summary>
//         private void CheckNextState(IFsm<PlayerController> fsm, PlayerController player)
//         {
//             // 检查是否有新的攻击输入
//             bool attackInput = fsm.GetData<BoolVariable>(KEY_ATTACK_INPUT)?.Value ?? false;
//             
//             if (attackInput && player.CanAttack())
//             {
//                 // 连击攻击
//                 ChangeState<PlayerAttackState>(fsm);
//                 return;
//             }
//             
//             // 检查其他输入
//             Vector3 moveInput = fsm.GetData<Vector3Variable>("MoveInput")?.Value ?? Vector3.zero;
//             bool jumpInput = fsm.GetData<BoolVariable>("JumpInput")?.Value ?? false;
//             bool isGrounded = fsm.GetData<BoolVariable>(KEY_IS_GROUNDED)?.Value ?? true;
//             
//             if (jumpInput && isGrounded)
//             {
//                 ChangeState<PlayerJumpState>(fsm);
//                 return;
//             }
//             
//             if (moveInput.magnitude > 0.1f)
//             {
//                 ChangeState<PlayerMoveState>(fsm);
//                 return;
//             }
//             
//             // 回到空闲状态
//             ChangeState<PlayerIdleState>(fsm);
//         }
//         
//         /// <summary>
//         /// 显示伤害数字
//         /// </summary>
//         private void ShowDamageNumber(Vector3 position, int damage)
//         {
//             // 这里可以实现伤害数字显示逻辑
//             // 例如：实例化UI预制体，设置伤害值等
//             Debug.Log($"显示伤害数字: {damage} at {position}");
//         }
//         
//         public override string GetStateName()
//         {
//             return "攻击状态";
//         }
//         
//         public override bool CanTransitionTo<TState>(IFsm<PlayerController> fsm)
//         {
//             // 攻击状态可以转换到大部分状态，但不能直接转换到死亡状态
//             if (typeof(TState) == typeof(PlayerDeathState))
//             {
//                 return false;
//             }
//             return true;
//         }
//     }
// }
